package model

import (
	"database/sql/driver"
	"fmt"
	"time"
)

type DateTime struct {
	time.Time
}

func (dt DateTime) MarshalJSON() ([]byte, error) {
	if dt.Time.IsZero() {
		return []byte(`""`), nil
	}
	formatted := dt.Time.Format(time.DateTime)
	// string必须要是不用双引号框起来
	return []byte(`"` + formatted + `"`), nil
}

func (dt *DateTime) UnmarshalJSON(data []byte) error {
	// 这里使用指针才能改变值 不然接收到的是副本 改了对原值无效 dt和*dt都可以改原值因为指向同一个对象
	if string(data) == `""` {
		return nil
	}
	t, err := time.ParseInLocation(`"`+time.DateTime+`"`, string(data), time.Local)
	dt.Time = t
	return err
}

func (dt *DateTime) Scan(v interface{}) error {
	value, ok := v.(time.Time)
	if ok {
		dt.Time = value
		return nil
	}
	return fmt.Errorf("can not convert %v to timestamp", v)
}

func (dt DateTime) Value() (driver.Value, error) {
	if dt.Time.IsZero() {
		return nil, nil
	}
	return dt.Time, nil
}
